static void gtk_tree_menu_get_preferred_height (GtkWidget *widget,
gint *minimum_size,
gint *natural_size);
+static void gtk_tree_menu_get_preferred_width_for_height (GtkWidget *widget,
+ gint for_height,
+ gint *minimum_size,
+ gint *natural_size);
+static void gtk_tree_menu_get_preferred_height_for_width (GtkWidget *widget,
+ gint for_width,
+ gint *minimum_size,
+ gint *natural_size);
/* GtkCellLayoutIface */
static void gtk_tree_menu_cell_layout_init (GtkCellLayoutIface *iface);
widget_class->get_preferred_width = gtk_tree_menu_get_preferred_width;
widget_class->get_preferred_height = gtk_tree_menu_get_preferred_height;
+ widget_class->get_preferred_width_for_height = gtk_tree_menu_get_preferred_width_for_height;
+ widget_class->get_preferred_height_for_width = gtk_tree_menu_get_preferred_height_for_width;
/*
* GtkTreeMenu::menu-activate:
g_signal_handler_unblock (priv->context, priv->size_changed_id);
}
+static void
+gtk_tree_menu_get_preferred_width_for_height (GtkWidget *widget,
+ gint for_height,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ GtkTreeMenu *menu = GTK_TREE_MENU (widget);
+ GtkTreeMenuPrivate *priv = menu->priv;
+
+ /* We leave the requesting work up to the cellviews which operate in the same
+ * context, reserving space for the submenu indicator if any of the items have
+ * submenus ensures that every cellview will receive the same allocated width.
+ *
+ * Since GtkMenu does hieght-for-width correctly, we know that the width of
+ * every cell will be requested before the height-for-widths are requested.
+ */
+ g_signal_handler_block (priv->context, priv->size_changed_id);
+
+ sync_reserve_submenu_size (menu);
+
+ GTK_WIDGET_CLASS (_gtk_tree_menu_parent_class)->get_preferred_width_for_height (widget, for_height, minimum_size, natural_size);
+
+ g_signal_handler_unblock (priv->context, priv->size_changed_id);
+}
+
+static void
+gtk_tree_menu_get_preferred_height_for_width (GtkWidget *widget,
+ gint for_width,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ GtkTreeMenu *menu = GTK_TREE_MENU (widget);
+ GtkTreeMenuPrivate *priv = menu->priv;
+
+ g_signal_handler_block (priv->context, priv->size_changed_id);
+
+ sync_reserve_submenu_size (menu);
+
+ GTK_WIDGET_CLASS (_gtk_tree_menu_parent_class)->get_preferred_height_for_width (widget, for_width, minimum_size, natural_size);
+
+ g_signal_handler_unblock (priv->context, priv->size_changed_id);
+}
+
/****************************************************************
* GtkCellLayoutIface *
****************************************************************/